import queue
from multiprocessing import Process
import time
import os
from queue import Queue

list1=[]
def p1():
    for i in range(4):
        list1.append(i)
        time.sleep(1)
        print('当前函数：p1\n当前结果：{}'.format(list1))
    print('当前进程为：%s,父进程为%s'%(os.getpid(),os.getppid()))
def p2():
    for i in range(4):
        list1.append(i)
        time.sleep(1)
        print('当前函数：p2\n当前结果：{}'.format(list1))
    print('当前进程为：%s,父进程为%s' % (os.getpid(), os.getppid()))

prc1=Process(target=p1)
prc2=Process(target=p2)
#prc1.start()
#prc2.start()
'''
当前进程为：2784,父进程为57764
当前进程为：59664,父进程为2784
当前进程为：52208,父进程为2784
当前函数：p1
当前结果：[0]
当前函数：p2
当前结果：[0]
当前函数：p1
当前结果：[0, 1]
当前函数：p2
当前结果：[0, 1]
当前函数：p1
当前结果：[0, 1, 2]
当前函数：p2
当前结果：[0, 1, 2]
当前函数：p1
当前结果：[0, 1, 2, 3]
当前进程为：59664,父进程为2784
当前函数：p2
当前结果：[0, 1, 2, 3]
当前进程为：52208,父进程为2784
'''
#说明了不同进程间不共享资源
#print('当前进程为：%s,父进程为%s' % (os.getpid(), os.getppid()))
#使用join阻塞进程和阻塞线程是一样的
'''
if __name__=='__main__':
    prc1.start()
    prc2.start()
    print('进程prc1的状态为：{}'.format(prc1.is_alive()))
    print('进程prc2的状态为：{}'.format(prc2.is_alive()))

当前进程为：22108,父进程为57764
进程prc1的状态为：True
进程prc2的状态为：True
当前进程为：53912,父进程为22108
当前进程为：59792,父进程为22108
当前函数：p1
当前结果：[0]
当前函数：p2
当前结果：[0]
当前函数：p1
当前结果：[0, 1]
当前函数：p2
当前结果：[0, 1]
当前函数：p1
当前结果：[0, 1, 2]
当前函数：p2
当前结果：[0, 1, 2]
当前函数：p1
当前结果：[0, 1, 2, 3]
当前进程为：53912,父进程为22108
当前函数：p2
当前结果：[0, 1, 2, 3]
当前进程为：59792,父进程为22108
'''
'''
if __name__=='__main__':
    prc1.start()
    prc1.join()
    prc2.start()
    prc2.join()
    print('进程prc1的状态为：{}'.format(prc1.is_alive()))
    print('进程prc2的状态为：{}'.format(prc2.is_alive()))
'''
'''
当前进程为：37188,父进程为57764
当前进程为：59316,父进程为37188
当前函数：p1
当前结果：[0]
当前函数：p1
当前结果：[0, 1]
当前函数：p1
当前结果：[0, 1, 2]
当前函数：p1
当前结果：[0, 1, 2, 3]
当前进程为：59316,父进程为37188
当前进程为：21008,父进程为37188
当前函数：p2
当前结果：[0]
当前函数：p2
当前结果：[0, 1]
当前函数：p2
当前结果：[0, 1, 2]
当前函数：p2
当前结果：[0, 1, 2, 3]
当前进程为：21008,父进程为37188
进程prc1的状态为：False
进程prc2的状态为：False
'''
'''
prc1.start()
#结果会报错
下面是deepseek给出的解释：
要解决这个错误，你需要确保在 Windows 下使用 multiprocessing 模块时，将启动子进程的代码放在 if __name__ == '__main__': 块中。
错误原因：
在 Windows 中，Python 使用 spawn 方法创建子进程，这会重新导入主模块。
如果直接在主模块的全局作用域中创建/启动进程，子进程会再次执行这些代码，导致递归创建进程，从而引发错误。
解决方法：
将进程启动代码包裹在 if __name__ == '__main__': 块中。
'''
'''
队列(先进先出，first in first out,FIFO)
'''

q1=Queue(3)#队列最多能接收3条消息
q1.put('hello world')
q1.put('uni')
q1.put('m')
if q1.empty():
    print('队列是空的')
if q1.full():
    print('队列已满')

print(q1.get())
print(q1.get())
print(q1.get())
'''
if q1.empty():
    print('队列是空的')
if q1.full():
    print('队列已满')
队列已满
hello world
uni
m
队列是空的
print(q1.get())#进程不会结束，这条语句也不会执行
q1.put(18)#同理，这条语句在队列满的时候也不执行
甚至使用try都没用，无敌了
'''
'''
try:
    q1.put(18,True,1)
except queue.Full as e:
    print(f'队列已满,报错为{e}')
'''
'''
队列已满
队列已满,报错为
这下又看不懂了：queue.Full是没有报错提示的
'''
'''
try:
    q1.put(18,False)
except:
    print('队列已满')
'''
'''
队列已满
队列已满，报错为
队列已满
'''
#总结：put里面其实是三个参数：item,block和timeout，其中item是必填的，表示放入的内容;block选填TruE和False,表示如果队列满了是否阻塞;timeout当block为TruE时需要填阻塞时间
#合理怀疑：get里面也有这样的参数，才导致默认无限阻塞？
try:
    q1.get(False)
except:
    print('队列是空的')#队列是空的
